<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>删除的映射类型 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'removal-of-types.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/removal-of-types.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/removal-of-types.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/removal-of-types.html" rel="nofollow" target="_blank">../en/removal-of-types.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="mapping.html">映射</a></span>
»
<span class="breadcrumb-node">删除的映射类型</span>
</div>
<div class="navheader">
<span class="prev">
<a href="mapping.html">« 映射</a>
</span>
<span class="next">
<a href="mapping-types.html">字段数据类型 »</a>
</span>
</div>
<div class="chapter">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="removal-of-types"></a>删除的映射类型
</h2>
</div></div></div>
<div class="important admon">
<div class="icon"></div>
<div class="admon_content">
<p>
在 Elasticsearch 7.0.0 或更高版本中创建的索引不再接受<code class="literal">_default_</code>映射。

在 6.x 中创建的索引将继续像以前一样在 Elasticsearch 6.x 中运行。

在7.0的API中 type 被废弃，对索引创建、设置映射、获取映射、设置模板、获取模板及获取字段映射API进行了重大更改。
</p>
</div>
</div>
<h3>
<a id="_what_are_mapping_types"></a>映射类型是什么?
</h3>
<p>
自从Elasticsearch第一次发布以来，每个文档都存储在一个索引中，并被分配一个映射类型。

映射类型用于表示被索引的文档或实体的类型，例如，一个名为<code class="literal">twitter</code>的索引可能有一个<code class="literal">user</code>类型和一个<code class="literal">tweet</code>类型。
</p>
<p>每种映射类型都有自己的字段，因此用户类型可能有一个<code class="literal">full_name</code>字段、一个<code class="literal">user_name</code>字段和一个<code class="literal">email</code>字段；而<code class="literal">tweet</code>类型可能有一个<code class="literal">content</code>字段、一个<code class="literal">tweeted_at</code>字段，和用户类型一样，还有一个<code class="literal">user_name</code>字段。</p>
<p>每个文档都有一个包含类型名称的<code class="literal">_type</code>元字段，通过在URL中指定类型名称，可以将搜索限制到一个或多个类型：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">GET twitter/user,tweet/_search
{
  "query": {
    "match": {
      "user_name": "kimchy"
    }
  }
}</pre>
</div>
<p>字段<code class="literal">_type</code>与文档的<code class="literal">_id</code>组合起来生成字段<code class="literal">_uid</code>，因此具有相同<code class="literal">_id</code>的不同类型的文档可以存在于一个索引中。</p>
<p>映射类型还用于建立文档之间的<a class="xref" href="parent-join.html" title="Join datatype">父-子关系</a>，因此<code class="literal">question</code>类型的文档可以是<code class="literal">answer</code>类型文档的父文档。</p>
<h3>
<a id="_why_are_mapping_types_being_removed"></a>为什么要删除映射类型？
</h3>
<p>最初，我们谈到“索引(index)”类似于SQL数据库中的“数据库(database)”，而“类型(type)”相当于“表(tbale)”。</p>
<p>
这是一个糟糕的类比，导致了错误的假设。

在SQL数据库中，表是相互独立的。

一个表中的列与另一个表中同名的列没有关系。

对于映射类型中的字段，情况却并非如此。
</p>
<p>
在一个 Elasticsearch 索引中，不同映射类型中具有相同名称的字段在内部由相同的 Lucene 字段支持。

换句话说，使用上面的例子，<code class="literal">user</code>类型中的字段<code class="literal">user_name</code>与<code class="literal">tweet</code>类型中的字段<code class="literal">user_name</code>存储在完全相同的字段中，并且两个<code class="literal">user_name</code>字段在两种类型中必须具有相同的映射(定义)。
</p>
<p>例如，当你希望在同一个索引中，字段<code class="literal">deleted</code>在一种类型下是<code class="literal">date</code>(类型的)字段，而在另一种类型下是<code class="literal">boolean</code>(类型的)字段时，这可能会导致失败。</p>
<p>最重要的是，在同一个索引中存储很少或没有共同字段的不同实体会导致数据稀疏，并干扰 Lucene 有效压缩文档的能力。</p>
<p>出于这些原因，我们决定从Elasticsearch中删除映射类型的概念。</p>
<h3>
<a id="_alternatives_to_mapping_types"></a>映射类型的替代方法
</h3>
<h4>
<a id="_index_per_document_type"></a>一个文档类型一个索引
</h4>
<p>
第一种方法是为每种文档类型建立一个索引。

可以将 tweets 存储在索引<code class="literal">tweets</code>中，将 users 存储在索引<code class="literal">user</code>中，而不是将 tweets 和 users 存储在同一个索引<code class="literal">twitter</code>中。

索引彼此完全独立，因此索引之间不会有字段类型冲突。
</p>
<p>这种方法有两个有点：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
数据更可能是密集的，因此可以受益于Lucene中使用的压缩技术。
</li>
<li class="listitem">
在全文搜索中用于评分的词项统计更有可能是准确的，因为同一索引中的所有文档都代表一个实体。
</li>
</ul>
</div>
<p>每个索引可以根据其包含的文档数量进行适当调整：你可以为索引<code class="literal">users</code>使用较少数量的主分片，而为索引<code class="literal">tweets</code>使用较多数量的主分片。</p>
<h4>
<a id="_custom_type_field"></a>自定义类型字段
</h4>
<p>
当然，一个集群中可存在的主分片的数量是有限制的，所以你可能不希望为了几千个文档的集合而浪费整个分片。

在这种情况下，你可以实现自己的自定义<code class="literal">type</code>字段，其工作方式与老的<code class="literal">_type</code>类似。
</p>
<p>让我们以上面的<code class="literal">user</code>/<code class="literal">tweet</code>为例。最初，工作流应该是这样的：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">PUT twitter
{
  "mappings": {
    "user": {
      "properties": {
        "name": { "type": "text" },
        "user_name": { "type": "keyword" },
        "email": { "type": "keyword" }
      }
    },
    "tweet": {
      "properties": {
        "content": { "type": "text" },
        "user_name": { "type": "keyword" },
        "tweeted_at": { "type": "date" }
      }
    }
  }
}

PUT twitter/user/kimchy
{
  "name": "Shay Banon",
  "user_name": "kimchy",
  "email": "shay@kimchy.com"
}

PUT twitter/tweet/1
{
  "user_name": "kimchy",
  "tweeted_at": "2017-10-24T09:00:00Z",
  "content": "Types are going away"
}

GET twitter/tweet/_search
{
  "query": {
    "match": {
      "user_name": "kimchy"
    }
  }
}</pre>
</div>
<p>可以通过添加自定义的<code class="literal">type</code>字段来实现相同的目的，如下所示：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">PUT twitter
{
  "mappings": {
    "_doc": {
      "properties": {
        "type": { "type": "keyword" }, <a id="CO284-1"></a><i class="conum" data-value="1"></i>
        "name": { "type": "text" },
        "user_name": { "type": "keyword" },
        "email": { "type": "keyword" },
        "content": { "type": "text" },
        "tweeted_at": { "type": "date" }
      }
    }
  }
}

PUT twitter/_doc/user-kimchy
{
  "type": "user", <a id="CO284-2"></a><i class="conum" data-value="1"></i>
  "name": "Shay Banon",
  "user_name": "kimchy",
  "email": "shay@kimchy.com"
}

PUT twitter/_doc/tweet-1
{
  "type": "tweet", <a id="CO284-3"></a><i class="conum" data-value="1"></i>
  "user_name": "kimchy",
  "tweeted_at": "2017-10-24T09:00:00Z",
  "content": "Types are going away"
}

GET twitter/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "user_name": "kimchy"
        }
      },
      "filter": {
        "match": {
          "type": "tweet" <a id="CO284-4"></a><i class="conum" data-value="1"></i>
        }
      }
    }
  }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO284-1"><i class="conum" data-value="1"></i></a><a href="#CO284-2"></a><a href="#CO284-3"></a><a href="#CO284-4"></a></p>
</td>
<td align="left" valign="top">
<p>显式的<code class="literal">type</code>字段取代了显式的<code class="literal">_type</code>字段。</p>
</td>
</tr>
</table>
</div>
<h4>
<a id="parent-child-mapping-types"></a>没有映射类型的父/子
</h4>
<p>
以前，父-子关系是通过将一个映射类型作为父类型，将一个或多个其他映射类型作为子类型来表示的。

没有类型，我们就不能再使用这种语法。

父子特性将继续像以前一样工作，只是表达文档之间关系的方式已经更改为使用新的<a class="xref" href="parent-join.html" title="join 数据类型" rel="nofollow"><code class="literal">join</code>字段</a>。
</p>
<h3>
<a id="_schedule_for_removal_of_mapping_types"></a>映射类型的删除计划
</h3>
<p>对于我们的用户来说，这是一个很大的变化，所以我们尽量让它不那么痛苦。变更将按如下方式展开：</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
Elasticsearch 5.6.0
</span>
</dt>
<dd>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
在索引上设置<code class="literal">index.mapping.single_type: true</code>将启用每个索引一个类型的行为，这将在 6.0 中强制实施。
</li>
<li class="listitem">
父-子关系的<a class="xref" href="parent-join.html" title="join 数据类型" rel="nofollow"><code class="literal">join</code>字段</a>替换在 5.6 中创建的索引上可用。
</li>
</ul>
</div>
</dd>
<dt>
<span class="term">
Elasticsearch 6.x
</span>
</dt>
<dd>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
在 5.x 中创建的索引将像在 5.x 中一样继续在 6.x 中运行。
</li>
<li class="listitem">
在 6.x 中创建的索引只允许一个索引一个类型。

类型可以使用任何名称，但只能有一个。

首选的类型名称是<code class="literal">_doc</code>，这样索引API就有了与 7.0 中相同的路径：<code class="literal">PUT {index}/_doc/{id}</code> 及 <code class="literal">POST {index}/_doc</code>
</li>
<li class="listitem">
<code class="literal">_type</code>名称不能再与<code class="literal">_id</code>组合形成字段<code class="literal">_uid</code>。

字段<code class="literal">_uid</code>已成为字段<code class="literal">_id</code>的别名。
</li>
<li class="listitem">
新的索引不再支持旧式的父/子索引，而应该使用<a class="xref" href="parent-join.html" title="join 数据类型" rel="nofollow"><code class="literal">join</code>字段</a>代替。
</li>
<li class="listitem">
<code class="literal">_default_</code>映射类型已废弃。
</li>
<li class="listitem">
在6.8中，索引创建、索引模板和映射API支持查询字符串参数(<code class="literal">include_type_name</code>)，该参数指示请求和响应是否应包含类型名称。

它默认为<code class="literal">true</code>，如果准备升级到 7.0 则应该显式的设置一个值。

没有显式类型的索引将使用名为<code class="literal">_doc</code>的虚拟类型。
</li>
</ul>
</div>
</dd>
<dt>
<span class="term">
Elasticsearch 7.x
</span>
</dt>
<dd>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
在请求中指定类型已被废弃。

例如，为文档编制索引不再需要文档<code class="literal">type</code>。

新的编制索引API在显式指定 id 的情况下是<code class="literal">PUT {index}/_doc/{id}</code>，在自动生成 id 的情况下<code class="literal">POST {index}/_doc</code>。

请注意，在 7.0 中，<code class="literal">_doc</code>是路径的永久部分，它表示终端名称，而不是文档类型。 
</li>
<li class="listitem">
索引创建、索引模板和映射API中的参数<code class="literal">include_type_name</code>将默认为<code class="literal">false</code>。

设置该参数将导致一个废弃警告。
</li>
<li class="listitem">
<code class="literal">_default_</code>映射类型已被删除。
</li>
</ul>
</div>
</dd>
<dt>
<span class="term">
Elasticsearch 8.x
</span>
</dt>
<dd>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
不再支持在请求中指定类型。
</li>
<li class="listitem">
参数<code class="literal">include_type_name</code>已被删除。
</li>
</ul>
</div>
</dd>
</dl>
</div>
<h3>
<a id="_migrating_multi_type_indices_to_single_type"></a>将多类型索引迁移到单一类型
</h3>
<p>
<a class="xref" href="docs-reindex.html" title="reindex API" rel="nofollow">重新索引(reindex) API</a>可用于将多类型索引转换为单一类型索引。

下面这个示例可用于 Elasticsearch 5.6 或 Elasticsearch 6.x。

在 6.x 中，不需要指定<code class="literal">index.mapping.single_type</code>，因为这是默认值。
</p>
<h4>
<a id="_index_per_document_type_2"></a>一个文档类型一个索引
</h4>
<p>
第一个例子将索引<code class="literal">twitter</code>切分为索引<code class="literal">tweets</code>和<code class="literal">users</code>：
</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">PUT users
{
  "settings": {
    "index.mapping.single_type": true
  },
  "mappings": {
    "_doc": {
      "properties": {
        "name": {
          "type": "text"
        },
        "user_name": {
          "type": "keyword"
        },
        "email": {
          "type": "keyword"
        }
      }
    }
  }
}

PUT tweets
{
  "settings": {
    "index.mapping.single_type": true
  },
  "mappings": {
    "_doc": {
      "properties": {
        "content": {
          "type": "text"
        },
        "user_name": {
          "type": "keyword"
        },
        "tweeted_at": {
          "type": "date"
        }
      }
    }
  }
}

POST _reindex
{
  "source": {
    "index": "twitter",
    "type": "user"
  },
  "dest": {
    "index": "users",
    "type": "_doc"
  }
}

POST _reindex
{
  "source": {
    "index": "twitter",
    "type": "tweet"
  },
  "dest": {
    "index": "tweets",
    "type": "_doc"
  }
}</pre>
</div>
<h4>
<a id="_custom_type_field_2"></a>自定义 type 字段
</h4>
<p>
下一个示例添加了一个自定义<code class="literal">type</code>字段，并将其设置为原始的<code class="literal">_type</code>值。

它还将类型添加到<code class="literal">_id</code>中，以防有任何不同类型的文档具有冲突的id:
</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">PUT new_twitter
{
  "mappings": {
    "_doc": {
      "properties": {
        "type": {
          "type": "keyword"
        },
        "name": {
          "type": "text"
        },
        "user_name": {
          "type": "keyword"
        },
        "email": {
          "type": "keyword"
        },
        "content": {
          "type": "text"
        },
        "tweeted_at": {
          "type": "date"
        }
      }
    }
  }
}


POST _reindex
{
  "source": {
    "index": "twitter"
  },
  "dest": {
    "index": "new_twitter"
  },
  "script": {
    "source": """
      ctx._source.type = ctx._type;
      ctx._id = ctx._type + '-' + ctx._id;
      ctx._type = '_doc';
    """
  }
}</pre>
</div>
<h3>
<a id="_typeless_apis_in_7_0"></a>7.0 中的无类型API
</h3>
<p>在 Elasticsearch 7.0中，每个API都将支持无类型请求，指定一个类型会产生一个弃用警告。</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>
即使目标索引包含自定义类型(type)，无类型API也能工作。

例如，如果一个索引有一个自定义的类型<code class="literal">my_type</code>，我们可以使用无类型<code class="literal">index</code>调用向它添加文档，并使用无类型<code class="literal">get</code>调用加载文档。
</p>
</div>
</div>
<h4>
<a id="_index_apis"></a>索引 API
</h4>
<p>
索引创建、索引模板和映射API都支持一个新的<code class="literal">include_type_name</code> URL参数，该参数指定请求和响应中的映射定义是否应该包含类型的名称。

在 6.8 版中，该参数默认为<code class="literal">true</code>，以匹配 7.0 版之前在映射中使用类型名的行为。

在 7.0 版中默认为<code class="literal">false</code>，在 8.0 版中将被移除。
</p>
<p>
如果准备升级到 7.0， 应该在 6.8 版本的索引中显式设置。

为了避免在 6.8 中出现弃用警告，可以将该参数设置为<code class="literal">true</code>或<code class="literal">false</code>。

在 7.0 中，设置<code class="literal">include_type_name</code>将导致弃用警告。
</p>
<p>查看此选项设置为<code class="literal">false</code>时与Elasticsearch交互的一些示例：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT index_name?include_type_name=false
{
  "mappings": {
    "properties": { <a id="CO285-1"></a><i class="conum" data-value="1"></i>
      "foo": {
        "type": "keyword"
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/607.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO285-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>映射直接包含在<code class="literal">mappings</code>键下，没有类型名。</p>
</td>
</tr>
</table>
</div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT index_name/_mappings?include_type_name=false
{
  "properties": { <a id="CO286-1"></a><i class="conum" data-value="1"></i>
    "bar": {
      "type": "text"
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/608.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO286-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>映射直接包含在<code class="literal">mappings</code>键下，没有类型名。</p>
</td>
</tr>
</table>
</div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET index_name/_mappings?include_type_name=false</pre>
</div>
<div class="console_widget" data-snippet="snippets/609.console"></div>
<p>上面的调用返回：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  "index_name": {
    "mappings": {
      "properties": { <a id="CO287-1"></a><i class="conum" data-value="1"></i>
        "foo": {
          "type": "keyword"
        },
        "bar": {
          "type": "text"
        }
      }
    }
  }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO287-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>映射直接包含在<code class="literal">mappings</code>键下，没有类型名。</p>
</td>
</tr>
</table>
</div>
<h4>
<a id="_document_apis"></a>文档API
</h4>
<p>在 7.0 中，要调用编制索引API，必须使用<code class="literal">{index}/_doc</code>路径以自动生成<code class="literal">_id</code>，显式指定id时使用<code class="literal">{index}/_doc/{id}</code>路径。</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT index_name/_doc/1
{
  "foo": "baz"
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/610.console"></div>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  "_index": "index_name",
  "_id": "1",
  "_type": "_doc",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 0,
  "_primary_term": 1
}</pre>
</div>
<p>类似的，<code class="literal">get</code>和<code class="literal">delete</code> API使用<code class="literal">{index}/_doc/{id}</code>路径：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET index_name/_doc/1</pre>
</div>
<div class="console_widget" data-snippet="snippets/611.console"></div>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>
在 7.0 中，<code class="literal">_doc</code>代表终端名称，而不是文档类型。

<code class="literal">_doc</code>组件是<code class="literal">index</code>、<code class="literal">get</code>及<code class="literal">delete</code> API的永久路径部分，在 8.0 中不会被删除。
</p>
</div>
</div>
<p>对于包含类型和终端名称(如<code class="literal">_update</code>)的API路径，在 7.0 中，终端将紧跟在索引名称之后：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST index_name/_update/1
{
    "doc" : {
        "foo" : "qux"
    }
}

GET /index_name/_source/1</pre>
</div>
<div class="console_widget" data-snippet="snippets/612.console"></div>
<p>
类型也不应该出现在请求体中。

下面这个批量(bulk)编制索引的示例省略了URL和各个批量命令中的类型：
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST _bulk
{ "index" : { "_index" : "index_name", "_id" : "3" } }
{ "foo" : "baz" }
{ "index" : { "_index" : "index_name", "_id" : "4" } }
{ "foo" : "qux" }</pre>
</div>
<div class="console_widget" data-snippet="snippets/613.console"></div>
<h4>
<a id="_search_apis"></a>搜索 API
</h4>
<p>
当调用搜索API(如<code class="literal">_search</code>、<code class="literal">_msearch</code>或<code class="literal">_explain</code>)时，URL中不应包含类型。

此外，不应在查询、聚合或脚本中使用<code class="literal">_type</code>字段。
</p>
<h4>
<a id="_types_in_responses"></a>响应中的类型
</h4>
<p>
文档和搜索API将继续在响应中返回<code class="literal">_type</code>键，以避免响应解析中断。

但是，该键被认为是废弃的，不应再被引用。

在8.0中，类型将从响应中完全删除。
</p>
<p>
请注意，当使用已废弃的类型化API时，索引的映射类型将正常返回，但是无类型API将在响应中返回伪类型<code class="literal">_doc</code>。

例如，下面的无类型<code class="literal">get</code>调用将始终返回<code class="literal">_doc</code>作为类型，即使映射具有像<code class="literal">my_type</code>这样的自定义类型名称：
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT index/my_type/1
{
  "foo": "baz"
}

GET index_name/_doc/1</pre>
</div>
<div class="console_widget" data-snippet="snippets/614.console"></div>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
    "_index" : "index_name",
    "_type" : "_doc",
    "_id" : "1",
    "_version" : 1,
    "_seq_no" : 0,
    "_primary_term" : 1,
    "found": true,
    "_source" : {
        "foo" : "baz"
    }
}</pre>
</div>
<h4>
<a id="_index_templates"></a>索引模板
</h4>
<p>
建议通过将<code class="literal">include_type_name</code>设置为<code class="literal">false</code>来重新添加索引模板，以使其无类型。

在底层，无类型模板在创建索引时将使用伪类型<code class="literal">_doc</code>。 
</p>
<p>
如果无类型模板与类型化索引创建调用一起使用，或者类型化模板与无类型索引创建调用一起使用，则模板仍将被应用，但是索引创建调用将决定是否应该有类型。

例如，在下面的例子中，索引<code class="literal">index-1-01</code>将具有类型，尽管它匹配无类型的模板，而索引<code class="literal">index-2-01</code>将是无类型的，尽管它匹配定义类型的模板。

索引<code class="literal">index-1-01</code>和<code class="literal">index-2-01</code>都将从它们匹配的模板中继承<code class="literal">foo</code>字段。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT _template/template1
{
  "index_patterns":[ "index-1-*" ],
  "mappings": {
    "properties": {
      "foo": {
        "type": "keyword"
      }
    }
  }
}

PUT _template/template2?include_type_name=true
{
  "index_patterns":[ "index-2-*" ],
  "mappings": {
    "type": {
      "properties": {
        "foo": {
          "type": "keyword"
        }
      }
    }
  }
}

PUT index-1-01?include_type_name=true
{
  "mappings": {
    "type": {
      "properties": {
        "bar": {
          "type": "long"
        }
      }
    }
  }
}

PUT index-2-01
{
  "mappings": {
    "properties": {
      "bar": {
        "type": "long"
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/615.console"></div>
<p>
在隐式索引创建的情况下，由于文档被索引到一个尚不存在的索引中，所以总是使用模板。

这通常不是问题，因为无类型索引调用对类型化索引有效。 
</p>
<h4>
<a id="_mixed_version_clusters"></a>混合版本集群
</h4>
<p>
在由 6.8 和 7.0 节点组成的集群中，参数<code class="literal">include_type_name</code>应该在索引API(如索引创建)中指定。

这是因为该参数在 6.8 和 7.0 之间有不同的默认值，因此相同的映射定义对两个节点版本都无效。
</p>
<p>
无类型文档API(如<code class="literal">bulk</code>和<code class="literal">update</code>)仅在 7.0 版本中可用，不适用于 6.8 版本的节点。

这也适用于执行文档查找的无类型版本的查询，例如<code class="literal">terms</code>查询。
</p>
</div>
<div class="navfooter">
<span class="prev">
<a href="mapping.html">« 映射</a>
</span>
<span class="next">
<a href="mapping-types.html">字段数据类型 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>